home *** CD-ROM | disk | FTP | other *** search
- unit utils;
- {$g+,d+}
-
- INTERFACE
-
- const
- c_warning=$01;
- c_error=$02;
- c_display=$fe;
- c_fatal=$ff;
-
- var
- timer:longint absolute $0040:$006c;
-
- procedure keep(const code:byte);
- procedure getint(const num:byte;var p:pointer);
- procedure setint(const num:byte;const p:pointer);
- procedure asmcall(const p:pointer);
- function fex(const fn:string):boolean;
- function fsearch(const namep,pathp:string):string;
- function percent(const a,b:longint):longint;
- function hexbyte(const b:byte):string;
- function hexword(const w:word):string;
- function hexlong(const ww:longint):string;
- function fsize(const fn:string):longint;
- function fsize2(var f:file):longint;
- function smartdrver:integer;
- procedure starttime;
- function stoptime:longint;
- procedure error(s:string;x,y,mode:byte);
- function small(a,b:word):word;
- function large(a,b:word):word;
- function fdel(fn:string):boolean;
- function fren(n1,n2:string):boolean;
- function legalname(const fn:string):boolean;
- function buildstr(const ch:char;const num:byte):string;
- procedure flush_cache;
-
- IMPLEMENTATION
-
- uses crt;
-
- var
- oldtime:longint;
-
- procedure keep(const code:byte); assembler;
- asm
- mov ax,prefixseg
- mov es,ax
- mov dx,word ptr es:2
- sub dx,ax
- mov al,code
- mov ah,31h
- int 21h
- end;
-
- procedure getint(const num:byte;var p:pointer); assembler;
- asm
- push ds
- xor ax,ax
- mov ds,ax
- mov al,num
- mov si,ax
- shl si,2
- les di,p
- db 66h; movsw
- pop ds
- end;
-
- procedure setint(const num:byte;const p:pointer); assembler;
- asm
- cli
- xor ax,ax
- mov es,ax
- mov al,num
- mov di,ax
- shl di,2
- mov ax,word ptr [p]
- mov es:[di],ax
- mov ax,word ptr [p+2]
- mov es:[di+2],ax
- sti
- end;
-
- procedure asmcall(const p:pointer);assembler;
- asm
- call p
- end;
-
- function fsearch(const namep,pathp:string):string; assembler;
- asm
- push ds
- cld
- lds si,pathp
- lodsb
- mov bl,al
- xor bh,bh
- add bx,si
- les di,@result
- inc di
- @@1:
- push si
- push ds
- lds si,namep
- lodsb
- mov cl,al
- xor ch,ch
- rep movsb
- xor al,al
- stosb
- dec di
- mov ax,4300h
- lds dx,@result
- inc dx
- int 21h
- pop ds
- pop si
- jc @@2
- test cx,18h
- je @@5
- @@2:
- les di,@result
- inc di
- cmp si,bx
- je @@5
- xor ax,ax
- @@3:
- lodsb
- cmp al,';'
- je @@4
- stosb
- mov ah,al
- cmp si,bx
- jne @@3
- @@4:
- cmp ah,':'
- je @@1
- cmp ah,'\'
- je @@1
- mov al,'\'
- stosb
- jmp @@1
- @@5:
- mov ax,di
- les di,@result
- sub ax,di
- dec ax
- stosb
- @@6:
- pop ds
- end;
-
- function fex(const fn:string):boolean;
- begin
- fex:=(fsearch(fn,'')<>'');
- end;
-
- function percent(const a,b:longint):longint;
- begin
- percent:=round(a/b*100);
- end;
-
- function hexbyte(const b:byte):string;
- const hex:array[0..16]of char='0123456789abcdef';
- begin
- hexbyte:=hex[b shr 4]+hex[b and $f];
- end;
-
- function hexword(const w:word):string;
- begin
- hexword:=hexbyte(hi(w))+hexbyte(lo(w));
- end;
-
- function hexlong(const ww:longint):string;
- var w:array[1..2]of word absolute ww;
- begin
- hexlong:=hexword(w[2])+hexword(w[1]);
- end;
-
- function fsize(const fn:string):longint;
- var f:file;
- begin
- fsize:=-1;
- if not(fex(fn))then exit;
- assign(f,fn);
- {$i-} reset(f,1); {$i+}
- if(ioresult<>0)then exit;
- fsize:=filesize(f);
- close(f);
- end;
-
- function fsize2(var f:file):longint;
- begin
- fsize2:=-1;
- {$i-} close(f); {$i+} if(ioresult<>0)then ;
- {$i-} reset(f,1); {$i+}
- if(ioresult<>0)then exit;
- fsize2:=filesize(f);
- close(f);
- end;
-
- function smartdrver:integer; assembler;
- asm
- xor bx,bx
- xor cx,cx
- xor dx,dx
- mov ax,04a10h
- int 02fh
- jc @@error
- cmp ax,0babeh
- jne @@error
- mov ax,bp
- jmp @@exit
- @@error:
- mov ax,1
- neg ax
- @@exit:
- end;
-
- procedure starttime;
- begin
- oldtime:=timer;
- end;
-
- function stoptime:longint;
- var tmp:longint;
- begin
- tmp:=timer;
- stoptime:=(tmp-oldtime);
- end;
-
- procedure error(s:string;x,y,mode:byte);
- var
- fore:string;
- old:byte;
- begin
- old:=textattr;
- gotoxy(x,y);
- case mode of
- c_warning:begin fore:='warning: '; textcolor(darkgray); end;
- c_error: begin fore:='error: '; textcolor(lightred); end;
- c_fatal: begin fore:='fatal: '; textcolor(red); end;
- c_display:begin fore:=''; textcolor(white); end;
- end;
- write(fore,s);
- textattr:=old;
- if(mode in [c_fatal,c_display])then halt(1);
- end;
-
- function small(a,b:word):word; assembler;
- asm
- mov ax,a
- mov bx,b
- cmp ax,bx
- jbe @@exit
- mov ax,bx
- @@exit:
- end;
-
- function large(a,b:word):word; assembler;
- asm
- mov ax,a
- mov bx,b
- cmp ax,bx
- jae @@exit
- mov ax,bx
- @@exit:
- end;
-
- function setfattr(var filep:file;const attr:word):word; assembler;
- asm
- push ds
- lds dx,filep
- add dx,48
- mov cx,attr
- mov ax,4301h
- int 21h
- pop ds
- jc @@exit
- xor ax,ax
- @@exit:
- end;
-
- function legalname(const fn:string):boolean;
- var f:file;
- begin
- legalname:=true;
- if(fex(fn))then exit;
- assign(f,fn);
- setfattr(f,0);
- {$i-} rewrite(f,1); {$i+}
- if(ioresult<>0)then legalname:=false;
- {$i-} erase(f); {$i+} if(ioresult<>0)then ;
- end;
-
- function fdel(fn:string):boolean;
- var f:file;
- begin
- fdel:=false;
- if not(fex(fn))then exit;
- assign(f,fn);
- if(setfattr(f,0)<>0)then exit;
- {$i-} erase(f); {$i+} if(ioresult<>0)then exit;
- fdel:=true;
- end;
-
- function fren(n1,n2:string):boolean;
- var f:file;
- begin
- fren:=false;
- if not(fex(n1))or(fex(n2))then exit;
- assign(f,n1);
- {$i-} rename(f,n2); {$i+} if(ioresult<>0)then exit;
- fren:=true;
- end;
-
- function buildstr(const ch:char;const num:byte):string; assembler;
- asm
- xor ch,ch
- mov al,[num]
- mov cl,al
- les di,@result
- stosb
- jcxz @@exit
- mov al,[&ch]
- mov ah,al
- shr cl,1
- rep stosw
- adc cl,cl
- rep stosb
- @@exit:
- end;
-
- procedure flush_cache; assembler;
- asm
- mov ax,04a10h
- mov bx,1
- int 02fh
- end;
-
- end.